<!DOCTYPE html>
<html lang="zh-cn">
  <head>
    <meta charset="UTF-8">
    <title>Sucha's Blog - Archive for July, 2023</title>
    <meta name="generator" content="MarkdownProjectCompositor.lua">
    <meta name="author" content="Sucha">
    <meta name="keywords" content="suchang, programming, Linux, Lua">
    <meta name="description" content="Sucha's blog">
    <link rel="shortcut icon" href="../images/ico.png">
    <link rel="stylesheet" type="text/css" href="../styles/blog.css">
    <link rel="stylesheet" type="text/css" href="../styles/prism.min.css">
    <style id="site_theme"></style>
  </head>
  <body>
    <div id="body">
      <div id="text">
	   <!-- Page published by cmark-gfm begins here --><h1>Sucha's Blog ~ Archive for July, 2023</h1>
<p><a id="p1"></a></p>
<div class="date">23年7月29日 周六 21:39</div>
<h2>记录 LXC/LXD 使用相关</h2>
<p>不用 docker 的原因是，有些时候需要创建不同版本库的开发环境，这个时候，其实只是引用路径的不同，文件系统甚至是 directory 的，而不是 image，当然 LXD 貌似也没有提供类似 docker 的分层的文件系统，主要是我也不大懂 docker。</p>
<p>有一说一，后面其实发现 alpine 除了空间占用小一些，其他都是劣势，比如 musl 的 CRT，居然不能打印调用栈，我也是服气了，下面的内容来自之前的学习，大概是能建立起一个可以用的系统容器。</p>
<p>下面比如 a1、a2 是 alpine instance。</p>
<h3>创建 profile</h3>
<p>这个 profile 就是 default profile，后续从不同 image（发行版本）创建 container 时，会使用这里的 storage、network 等的配置</p>
<h3>创建 instance</h3>
<p>这里使用了 alpine 3.18 的 image，由于 container 可以直接保存东西，所以直接拉起来，这里 ash 是不会运行 <code>~/.profile</code> 的，如果是从 sshd 登陆进去的才会，所以这种情况下需要 source 一下 shell 的配置文件。</p>
<pre><code class="language-sh">$ lxc launch images:alpine/3.18 a1
$ lxc exec a1 ash
</code></pre>
<h3>挂载 host 目录到 instance</h3>
<p>比如挂载 host <code>/wwwdata</code> 到 a1 相关目录，之后删除这个挂载，这里的前提是文件其实是只读的，如果需要挂载读写的文件系统，需要创建一个用户权限 map 配置，在容器内的 /etc 相关配置中，不过感觉也不是很方便。</p>
<pre><code class="language-sh">$ lxc config device add a1 sharedwww disk source=/wwwdata/ path=/var/www/html/
$ lxc config device remove a1 sharedwww
</code></pre>
<h3>其他的问题</h3>
<p>用 alpine 容器还遇到问题，比如拉起 cincau 映射 host 端口到容器，容器内的 proxy，居然一直长连接到内部服务器，从不关闭连接，人家 ngnix proxy 就做得很好，由于遇到上面说的 musl CRT 不能打印堆栈，就没有继续研究下去了。</p>
<p>作为封闭的开发环境感觉还行，作为 production 的容器，首先不能用 alpine image，其次，还有不少需要摸索调整的东西吧。</p>
<p>先记录一下。</p>
<div class="category"><a href="CategoryLinux.html">CategoryLinux</a> / <a href="2023-07.html#p1">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<p><a id="p0"></a></p>
<div class="date">23年7月08日 周六 22:17</div>
<h2>OTP 研究</h2>
<p>学习了一下 OTP 这个东西，比如用的是 <a href="https://github.com/OTPLibraries/LuaOTP">LuaOTP</a>。</p>
<p>区分为 OTP、TOTP、HOTP 这三种，OTP 英文展开为 One Time Password，是服务端对客户端的一次性密码，属于双因素验证的范畴。</p>
<p>TOTP 这里，公式中的一个参与计算的因子是时间，比如这个时间因子，可以 30 秒更新一次，那这个一次性密码，也是 30 秒更新一次。</p>
<p>HOTP 有一个 counter 的概念，每次用过后都会变化，每次都生成新的，对应的是该一次性密码的使用次数。</p>
<p>上述 LuaOTP 支持 Google Authenticator，浏览器 JS 这边用的是<a href="https://www.runoob.com/w3cnote/javascript-qrcodejs-library.html">菜鸟教程</a>介绍的<a href="https://github.com/davidshimjs/qrcodejs">qrcodejs</a>，用来生成二维码图片。</p>
<p>当然也可以不生成图片，而是导出字符串，Google Authenticator 也同样支持字符串导入。</p>
<p>之前不大理解这一套，搞了一下，发现也没有那么难。</p>
<div class="category"><a href="CategoryProgramming.html">CategoryProgramming</a> / <a href="2023-07.html#p0">Permalink</a> / <a href="https://github.com/lalawue/homepage/discussions/categories/blog" target="_blank">Discussion</a></div>
<!-- Page published by cmark-gfm ends here -->
  <div id="foot">2004-<script>var d = new
	Date();document.write(d.getFullYear())</script> &copy;
	Sucha. Powered by MarkdownProjectCompositor.
  </div>
  </div><!-- text -->
  <div id="sidebar">
  </div><!-- sidebar -->
  <script src="../js/prism.min.js" async="async"></script>
  <script src="../js/blog_sidebar.js"></script>
  </div> <!-- body -->
</body>
</html>